package com.shlh.saas.service;

import com.shlh.saas.entity.UserBalance;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 用户余额服务接口
 */
public interface UserBalanceService {
    

    /**
     * 增加用户余额
     * @param userId 用户ID
     * @param amount 增加的金额
     * @return 增加后的余额
     */
    BigDecimal addBalance(Long userId, BigDecimal amount);
    

    /**
     * 获取用户余额信息
     * @param phone 用户手机号
     * @return 用户余额信息
     * @deprecated 使用 {@link #getUserBalanceById(Long)} 代替
     */
    @Deprecated
    UserBalance getUserBalance(String phone);
    
    /**
     * 通过用户ID获取用户余额信息
     * @param userId 用户ID
     * @return 用户余额信息
     */
    UserBalance getUserBalanceById(Long userId);
    
    /**
     * 通过用户ID获取用户余额信息
     * @param userId 用户ID
     * @return 用户余额信息
     */
    UserBalance getByUserId(Long userId);
    
    /**
     * 更新用户余额信息
     * @param userBalance 用户余额实体
     * @return 是否更新成功
     */
    int updateById(UserBalance userBalance);
    
    /**
     * 更新用户的VIP等级和到期时间
     * @param phone 用户手机号
     * @param vipLevel VIP等级
     * @param months VIP有效期（月）
     * @return 是否更新成功
     * @deprecated 使用 {@link #updateUserVipById(Long, Integer, Integer, Integer, Integer, Integer)} 代替
     */
    @Deprecated
    boolean updateUserVip(String phone, Integer vipLevel, Integer months, Integer exportQuota, Integer viewRecords, Integer reverseLookup);
    
    /**
     * 通过用户ID更新用户的VIP等级和到期时间
     * @param userId 用户ID
     * @param vipLevel VIP等级
     * @param months VIP有效期（月）
     * @return 是否更新成功
     */
    boolean updateUserVipById(Long userId, Integer vipLevel, Integer months, Integer exportQuota, Integer viewRecords, Integer reverseLookup);
    
    /**
     * 增加用户邮件发送配额
     * @param phone 用户手机号
     * @param count 增加的数量
     * @return 是否更新成功
     * @deprecated 使用 {@link #increaseEmailQuotaById(Long, Integer)} 代替
     */
    @Deprecated
    boolean increaseEmailQuota(String phone, Integer count);
    
    /**
     * 通过用户ID增加用户邮件发送配额
     * @param userId 用户ID
     * @param count 增加的数量
     * @return 是否更新成功
     */
    boolean increaseEmailQuotaById(Long userId, Integer count);
    
    /**
     * 更新用户的邮件套餐等级
     * @param phone 用户手机号
     * @param packageLevel 邮件套餐等级
     * @return 是否更新成功
     * @deprecated 使用 {@link #updateEmailPackageLevelById(Long, Integer)} 代替
     */
    @Deprecated
    boolean updateEmailPackageLevel(String phone, Integer packageLevel);
    
    /**
     * 通过用户ID更新用户的邮件套餐等级
     * @param userId 用户ID
     * @param packageLevel 邮件套餐等级
     * @return 是否更新成功
     */
    boolean updateEmailPackageLevelById(Long userId, Integer packageLevel);
    
    /**
     * 同步用户余额记录
     * 确保所有users表中的用户在user_balances表中都有对应记录
     */
    void syncUserBalances();
    
    /**
     * 扣除用户查看记录余额
     * @param userId 用户ID
     * @param count 扣除的数量
     * @return 是否扣除成功
     */
    boolean deductViewRecords(Long userId, Integer count);
    
    /**
     * 扣除用户导出次数余额
     * @param userId 用户ID
     * @param count 扣除的数量
     * @return 是否扣除成功
     */
    boolean deductExportQuota(Long userId, Integer count);
    
    /**
     * 扣除用户反查次数余额
     * @param userId 用户ID
     * @param count 扣除的数量
     * @return 是否扣除成功
     */
    boolean deductReverseLookup(Long userId, Integer count);
    
    /**
     * 更新用户邮件套餐过期时间
     * @param userId 用户ID
     * @param expireTime 过期时间
     * @return 是否更新成功
     */
    boolean updateEmailPackageExpireTimeById(Long userId, LocalDateTime expireTime);
} 